/**
 * # 数据实体类:
 *  User - 用户
 * 
 * # 描述:
 *  表示一个可以登录和使用系统的用户。
 *  
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package com.waln.authority.users.data;

/**
 * 用户。
 * 
 * 表示一个可以登录和使用系统的用户。
 */
public final class User extends pittypat.DataModel {
	/**
	 * Id。
	 */
	public java.util.UUID id;

	/**
	 * 登录名称。
	 * <p>
	 * 用户的登录名称。
	 */
	public String loginName;

	/**
	 * 编号。
	 * <p>
	 * 用户的编号，编号是唯一的，比如工号。登录时可以使用编号登录。
	 */
	public String no;

	/**
	 * 用户名称。
	 * <p>
	 * 用户的友好显示名称。
	 */
	public String name;

	/**
	 * 头像路径。
	 * <p>
	 * 用户头像文件的虚拟路径。
	 */
	public String faceUrl;

	/**
	 * 手机号码。
	 * <p>
	 * 用户的手机号码，如果提供了手机号码，必须是唯一的。
	 */
	public String mobile;

	/**
	 * 电子邮件地址。
	 * <p>
	 * 用户的电子邮件地址。如果提供了电子邮件地址，则必须是唯一的。
	 */
	public String email;

	/**
	 * 创建时间。
	 * <p>
	 * 创建用户账号的时间。
	 */
	public java.time.LocalDateTime createTime;

	/**
	 * 锁定时间。
	 * <p>
	 * 用户账号被锁定的时间。
	 */
	public java.time.LocalDateTime lockTime;

	/**
	 * 登录时间。
	 * <p>
	 * 用户最后一次登录系统的时间。
	 */
	public java.time.LocalDateTime loginTime;

	/**
	 * 登录后首页。
	 * <p>
	 * 用户在登录后进入的页面，由用户自己配置。支持 '~' 作为前缀的路径格式。
	 */
	public String loginHomeUrl;

	/**
	 * 登录后首页说明。
	 * <p>
	 * 对用户登录后首先进入的页面的说明信息。
	 */
	public String loginHomeDescription;

	/**
	 * 初始化 User 类的一个新实例。
	 */
	public User() {
		super();

		// Id
		this.id = null;
		// 登录名称
		this.loginName = null;
		// 编号
		this.no = null;
		// 用户名称
		this.name = null;
		// 头像路径
		this.faceUrl = null;
		// 手机号码
		this.mobile = null;
		// 电子邮件地址
		this.email = null;
		// 创建时间
		this.createTime = null;
		// 锁定时间
		this.lockTime = null;
		// 登录时间
		this.loginTime = null;
		// 登录后首页
		this.loginHomeUrl = null;
		// 登录后首页说明
		this.loginHomeDescription = null;
	}

	/**
	 * 从一个 DbDataReader 中读取此对象。
	 * 
	 * @param reader
	 * 			包含对象数据的 DbDataReader 对象。
	 * 
	 * @throws IllegalArgumentException
	 * 
	 * @see pittypat.DataModel#read(pittypat.data.DbDataReader)
	 * @see pittypat.data.DbDataReader
	 */
	@Override
	public void read(pittypat.data.DbDataReader reader) throws IllegalArgumentException {
		if (reader == null) {
			throw new IllegalArgumentException("reader 为 null。");
		}

		// Id
		this.id = reader.getUuid("id", this.id);
		// 登录名称
		this.loginName = reader.getString("loginName", this.loginName);
		// 编号
		this.no = reader.getString("no", this.no);
		// 用户名称
		this.name = reader.getString("name", this.name);
		// 头像路径
		this.faceUrl = reader.getString("faceUrl", this.faceUrl);
		// 手机号码
		this.mobile = reader.getString("mobile", this.mobile);
		// 电子邮件地址
		this.email = reader.getString("email", this.email);
		// 创建时间
		this.createTime = reader.getDateTime("createTime", this.createTime);
		// 锁定时间
		this.lockTime = reader.getDateTime("lockTime", this.lockTime);
		// 登录时间
		this.loginTime = reader.getDateTime("loginTime", this.loginTime);
		// 登录后首页
		this.loginHomeUrl = reader.getString("loginHomeUrl", this.loginHomeUrl);
		// 登录后首页说明
		this.loginHomeDescription = reader.getString("loginHomeDescription", this.loginHomeDescription);
	}

	/**
	 * 将当前对象作为 JSON 字符串写入指定的文本流。
	 * 
	 * @param writer
	 * 			目标文本流。
	 * 
	 * @throws IllegalArgumentException
	 * @throws java.io.IOException
	 * 
	 * @see pittypat.DataModel#write(java.io.Writer)
	 */
	@Override
	public void write(java.io.Writer writer) throws IllegalArgumentException, java.io.IOException {
		if (writer == null) {
			throw new IllegalArgumentException("writer 为 null。");
		}

		writer.write('{');

		// Id
		writer.write("\"id\":");
		pittypat.Json.write(writer, this.id);
		writer.write(',');

		// 登录名称
		writer.write("\"loginName\":");
		pittypat.Json.write(writer, this.loginName);
		writer.write(',');

		// 编号
		writer.write("\"no\":");
		pittypat.Json.write(writer, this.no);
		writer.write(',');

		// 用户名称
		writer.write("\"name\":");
		pittypat.Json.write(writer, this.name);
		writer.write(',');

		// 头像路径
		writer.write("\"faceUrl\":");
		pittypat.Json.write(writer, this.faceUrl);
		writer.write(',');

		// 手机号码
		writer.write("\"mobile\":");
		pittypat.Json.write(writer, this.mobile);
		writer.write(',');

		// 电子邮件地址
		writer.write("\"email\":");
		pittypat.Json.write(writer, this.email);
		writer.write(',');

		// 创建时间
		writer.write("\"createTime\":");
		pittypat.Json.write(writer, this.createTime);
		writer.write(',');

		// 锁定时间
		writer.write("\"lockTime\":");
		pittypat.Json.write(writer, this.lockTime);
		writer.write(',');

		// 登录时间
		writer.write("\"loginTime\":");
		pittypat.Json.write(writer, this.loginTime);
		writer.write(',');

		// 登录后首页
		writer.write("\"loginHomeUrl\":");
		pittypat.Json.write(writer, this.loginHomeUrl);
		writer.write(',');

		// 登录后首页说明
		writer.write("\"loginHomeDescription\":");
		pittypat.Json.write(writer, this.loginHomeDescription);

		writer.write('}');
	}
}
